//基本数据类型：String Number 按值操作

//引用数据类型：Object和Function -->地址操作

//->函数：1、创建一个函数 2、执行一个函数
function sum() {
  var total = null;
  total = 1 + 1;
  console.log(total);
}
//1、当浏览器加载页面的时候首先会提供一个供js代码执行的环境->全局作用域的环境 首先开辟一个新的内存空间，浏览器为其分配一个16进制的地址，我们假设地址为：xxxfff000
//2、把函数体中的js代码当做"字符串"存储到内存空间中
//3、再把这个地址赋值给当前的函数名sum ->sum =xxxfff000
sum; //->后面不加小括号，代表的就是当前函数本身
sum(); //后面加小括号，代表的是执行当前函数
//函数执行的目的：把函数之前存储的那些字符串变成js代码，然后再让js代码从上到下依次执行

//函数执行的步骤：
//1、函数执行的时候，首先会提供一个供函数体中代码执行的环境 ->'私有作用域'
//2、把函数体重的代码字符从上到下执行

//我们把函数执行的时候形成的这种保护机制叫做闭包

//return 函数的一个出口返回的是其值

//arguments

//实名函数：起了名字的函数就是实名函数
//匿名函数：没有起名字的函数就是匿名函数

//js中常用到的匿名函数有两种
//1、只执行函数：定义函数和函数执行一起完成了
//+ - ! ~ ; ()
//2、函数表达式：把函数定义的部分当做一个值赋值给一个变量或者元素的某一个行为
//oDiv.onclick=function(){}

//函数在整个js中是最复杂也是最重要的知识
/* 
1、一个函数存在了多面性：
普通函数：它本身就是一个普通的函数，执行的时候形成私有的作用域（闭包）形参赋值，预解释，代码执行，执行完成后栈内存销毁/不销毁
类：它有自己的实列，也有一个叫做prototype属性是自己的原型，他的实列都可以指向自己的原型
普通对象：和var obj = {}中的obj一样，就是一个普通的对象，它作为对象可以有一些自己的私有属性，也可以通过__proto__找到Function.prototype
这三者之间没有必然的关系
*/
function Fn(){
  this.x = 100
}
Fn.prototype.getX=function(){
  console.log(this.x)
}
Fn.aaa = 1000
var f = new Fn
f.num -->undefined
f.aaa -->undefined
var res =Fn()
res --> undefined
Fn.aaa -->1000